import com.tedu.springdemo.day02.Person;
import com.tedu.springdemo.day02.Zoo;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class test04 {
    /**
     * spring 默认支持单例模式
     * 单例模式：
     * spring容器在初始化创建对象的时候，将对象保存在容器内部当中Map里
     * 本质上从Map中查找并且返回的对象，所以，每次获取bean，获取同一对象
     * 优点:获取对象，直接从Spring内部的Map中获取---获取对象【减少内存开销，增加效率】
     * 缺点：每次执行xxx.xml   遇见bean标签，创建对象，保存内部Map中【bean标签越多，效率降低】
     *
     * 多例模式：（特定业务需求才会用：如：电商网站：购物车---需要有不同的用户【自己购物车】）
     * Spring 容器初始化时不创建对象，而是在每次获取Bean时，创建并且返回对象
     * 且对象不会保存在容器内部的Map中，每次创建得到新的对象
     * 优点：每次创建都是新的对象
     * 缺点：创建新对象，增加内存消耗
     */
    @Test
    public void test01(){
        ApplicationContext ac=new ClassPathXmlApplicationContext("beans6.xml");
        Person p1=(Person) ac.getBean("person");
        System.out.println(p1);
        Person p2=(Person) ac.getBean("person");
        System.out.println(p2);
        ((ClassPathXmlApplicationContext)ac).close();
    }
    /**
     * Spring容器：默认单例模式：遇bean标签创建对象，假设1万bean
     * 采用 懒加载  解决单例模式多次创建对象： 原则:谁着急，谁先执行
     * 延误对象创建时机
     */
    @Test
    public void test02(){
        ApplicationContext ac=new ClassPathXmlApplicationContext("beans7.xml");
        Zoo zoo=ac.getBean(Zoo.class);
        System.out.println(zoo);
        ((ClassPathXmlApplicationContext)ac).close();
    }
    /**
     * 程序debug操作，通过debug方式，怀疑某段代码有问题，停在代码位置上，有参数变化
     */
    @Test
    public void testFor(){
        for(int i=0;i<100;i++){
            System.out.println(i);
        }
    }
}
